package com.cell.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.cell.entity.User;

import javax.servlet.http.HttpSession;
import java.security.NoSuchAlgorithmException;
import java.util.List;

/**
 * @author cloudJiang
 * @date 2022/5/11 20:14
 */
public interface UserService extends IService<User> {
    /**
     * 通过password和loginKey字段来登录
     *
     * @param loginKey 登陆凭证
     * @param password 密码
     * @param session  当前会话的session，用于记录登录状态
     * @return 0 表示登陆成功， 1 表示非空字段为空， 2 表示找不到用户， 3 表示密码错误。
     * @throws NoSuchAlgorithmException
     */
    int login(String loginKey, String password, HttpSession session) throws NoSuchAlgorithmException;

    /**
     * 用户注册，位置信息在数据库中获取，登录凭证唯一
     *
     * @param user
     * @return 0 表示注册成功，1 表示字段校验未通过(校验规则见utils.UserUtil.validateUser)， 2 表示数据库存储失败
     */
    int signUp(User user);


    /**
     * 重置用户密码
     *
     * @param id
     * @param password
     * @return 重置成功返回0
     */
    int resetPassword(int id, String password);

    /**
     * 在重置密码前验证旧密码
     *
     * @param id
     * @param password
     * @return 密码验证通过返回0 ，未通过返回 1，数据库出现问题返回2
     */
    int validOldPassword(int id, String password);

    /**
     * 在重置密码前通过邮箱验证
     *
     * @param userID 用户id，通过该值来查找用户
     * @param code   用户输入的验证码
     * @return 正确返回0，否则1
     */
    int validEmailCode(int userID, String code);

    /**
     * 将email发送到响应邮箱
     *
     * @param userID 用户id，通过该值来查找用户，在用户中查找到邮箱后发送验证邮件
     *               之后将验证码值存储到用户对象中
     * @return
     */
    void sendEmail(int userID);

    /**
     * 用户第一次发布订单，此时订单状态为0待接单
     *
     * @param salID  卖家id
     * @param weight 卖家填写大概重量
     * @param type   回收物品类型
     * @param name   回收物品名称
     * @return 成功返回0, 否则返回1
     */
    int commitOrder(int salID, double weight, String type, String name);

    /**
     * 接收订单，订单中填入开始时间，买方id，以及订单开始时间（当前时间）
     * 此时订单状态为1
     *
     * @return 订单接受成功返回0，否则返回1
     */
    int acceptOrder();

    /**
     * 用户接受并完成当前订单，将订单状态修改为2，
     * 并填入正确的物品重量（singlePrice），此时order中计算totalPrice并填入字段
     *
     * @return 成功返回0，否则返回1
     */
    int overOrder();

    /**
     * 用户提交订单异常，更改订单状态为4，错误信息必填。
     *
     * @return 成功返回0，错误信息字段空返回1
     */
    int commitErrorOrder();

    /**
     * 用户提前结束订单，在订单状态为2的情况下更改订单状态为3
     *
     * @return
     */
    int endOrder();

    /**
     * 通过传入的不同状态码来查询订单
     */
    void getAllOrder(int states);

    /**
     * 删除订单
     */
    void deleteOrder();

    /**
     * 查看附近社区代理
     *
     * @return
     */
    List<User> getNearbyCommunityAgent(User user);

    /**
     * 查看附近的区域代理
     *
     * @return
     */
    List<User> getNearbyDistrictAgent(User user);

    /**
     * 用户注销
     */
    void deleteUser(User user);
}
